package cl.loso.melon.server.negocio;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import cl.loso.melon.server.model.AreaLVS;
import cl.loso.melon.server.model.GerenciaLVS;
import cl.loso.melon.server.model.ItemLVS;
import cl.loso.melon.server.model.NegocioLVS;
import cl.loso.melon.server.model.SitioLVS;
import cl.loso.melon.server.model.UsuarioLVS;
import cl.loso.melon.server.model.VisitaItemLVS;
import cl.loso.melon.server.model.VisitaLVS;
import cl.loso.melon.server.persistencia.GerenciaLVSDAO;
import cl.loso.melon.server.persistencia.MetaLVSDAO;
import cl.loso.melon.server.persistencia.VisitaLVSDAO;
import cl.loso.melon.server.pojos.ItemLVS2;
import cl.loso.melon.server.pojos.VisitaLVS2;

public class VisitaLVSBO {
	private static Log log = LogFactory.getLog(VisitaLVSBO.class);

	public static List<VisitaLVS> obtenerVisitaLVS(String idUsuario)
			throws Exception {
		try {
			return VisitaLVSDAO.obtener(idUsuario);
		} catch (Exception e) {
			log.error("VisitaLVSBO" + e.getMessage());
			throw e;
		}
	}

	public static void actualizarVisitaLVS(String idUsuario, String idVisita,
			String fecha, String personas, String horini, String horter,
			String idNegocio, String idSitio, String idArea, String comentario,
			Object[] seguro, Object[] inseguro) throws Exception {
		try {
			DateFormat formato1 = new SimpleDateFormat("dd/MM/yyyy");
			DateFormat formato2 = new SimpleDateFormat("dd/MM/yyyy HH:mm");
			Date fecha_visita = (Date) formato1.parse(fecha);
			Date hora_inicio_visita = (Date) formato2.parse(fecha + " "
					+ horini);
			Date hora_termino_visita = (Date) formato2.parse(fecha + " "
					+ horter);
			Long duracion = hora_termino_visita.getTime()
					- hora_inicio_visita.getTime();

			Long tseguro = new Long(seguro.length);
			Long tinseguro = new Long(inseguro.length);

			Hashtable<Long, Seguridad> ht = new Hashtable<Long, Seguridad>();

			for (int i = 0; i < tseguro; i++) {
				ht.put(Long.valueOf(seguro[i].toString()), new Seguridad(true,
						false));
			}
			for (int i = 0; i < tinseguro; i++) {
				ht.put(Long.valueOf(inseguro[i].toString()), new Seguridad(
						false, true));
			}

			UsuarioLVS usuario = UsuarioLVSBO.editarUsuarioLVS(idUsuario);
			NegocioLVS negocio = NegocioLVSBO.editarNegocioLVS(idNegocio);
			SitioLVS sitio = SitioLVSBO.editarSitioLVS(idNegocio, idSitio);
			AreaLVS area = AreaLVSBO.editarAreaLVS(idNegocio, idSitio, idArea);
			Long tmeta = (MetaLVSDAO.obtenerLaMeta(fecha_visita, usuario))
					.longValue();

			//Long idNegocioUsuario = usuario.getNegocio();
			//NegocioLVS negocioUsuario = NegocioLVSBO
					//.editarNegocio(idNegocioUsuario);
			//Long idGerencia = usuario.getGerencia();
			//GerenciaLVS gerencia = GerenciaLVSDAO.getGerenciabyId(idGerencia);

			VisitaLVSDAO.actualizar(Long.valueOf(idUsuario), Long
					.valueOf(idVisita), fecha_visita,
					Integer.valueOf(personas), hora_inicio_visita,
					hora_termino_visita, new Long(1), Long.valueOf(idNegocio),
					Long.valueOf(idSitio), Long.valueOf(idArea), comentario,
					ht, tseguro, tinseguro, tmeta, duracion, usuario
							.getNombres()
							+ " " + usuario.getApepa(), negocio.getNombre(),
					sitio.getNombre(), area.getNombre());


		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;
		}
	}

	public static void guardarVisitaLVS(String idUsuario, String fecha,
			String personas, String horini, String horter, String idNegocio,
			String idSitio, String idArea, String comentario, Object[] seguro,
			Object[] inseguro) throws Exception {
		try {
			//log.info("guardarVisitaLVS idUsuario : " + idUsuario);
			//log.info("guardarVisitaLVS horini : " + horini);
			//log.info("guardarVisitaLVS fecha : " + fecha);
			Long tseguro = new Long(seguro.length);
			Long tinseguro = new Long(inseguro.length);

			UsuarioLVS usuario = UsuarioLVSBO.editarUsuarioLVS(idUsuario);
			NegocioLVS negocio = NegocioLVSBO.editarNegocioLVS(idNegocio);
			SitioLVS sitio = SitioLVSBO.editarSitioLVS(idNegocio, idSitio);
			AreaLVS area = AreaLVSBO.editarAreaLVS(idNegocio, idSitio, idArea);
			Long idNegocioUsuario = usuario.getNegocio();
			NegocioLVS negocioUsuario = NegocioLVSBO
					.editarNegocio(idNegocioUsuario);
			Long idGerencia = usuario.getGerencia();
			GerenciaLVS gerencia = GerenciaLVSDAO.getGerenciabyId(idGerencia);

			DateFormat formato1 = new SimpleDateFormat("dd/MM/yyyy");
			DateFormat formato2 = new SimpleDateFormat("dd/MM/yyyy HH:mm");
			Date fecha_visita = (Date) formato1.parse(fecha);
			Date hora_inicio_visita = (Date) formato2.parse(fecha + " "
					+ horini);
			Date hora_termino_visita = (Date) formato2.parse(fecha + " "
					+ horter);

			Long duracion = hora_termino_visita.getTime()
					- hora_inicio_visita.getTime();

			Long tmeta = (MetaLVSDAO.obtenerLaMeta(fecha_visita, usuario))
					.longValue();
			//log.info("meta correspondiente al mes de la visita : " + tmeta);

			VisitaLVS visita = new VisitaLVS(fecha_visita, hora_inicio_visita,
					hora_termino_visita, Integer.parseInt(personas),
					comentario, negocio.getId().longValue(), sitio.getKey()
							.getId(), area.getKey().getId(), 0, usuario,
					tseguro, tinseguro, tmeta, duracion, usuario.getNombres()
							+ " " + usuario.getApepa(), negocio.getNombre(),
					sitio.getNombre(), area.getNombre(), usuario.getEmail(),
					usuario.getNegocio(), negocioUsuario.getNombre(),idGerencia,gerencia.getNombre());

			List<VisitaLVS> visitas = new ArrayList<VisitaLVS>();

			visitas.add(visita);

			usuario.setVisitas(visitas);

			List<VisitaItemLVS> visitaitems = new ArrayList<VisitaItemLVS>();

			Hashtable<Long, Seguridad> ht = new Hashtable<Long, Seguridad>();

			for (int i = 0; i < seguro.length; i++) {
				ht.put(Long.valueOf(seguro[i].toString()), new Seguridad(true,
						false));
			}

			for (int i = 0; i < inseguro.length; i++) {
				ht.put(Long.valueOf(inseguro[i].toString()), new Seguridad(
						false, true));
			}

			List<ItemLVS> item = ItemSVLBO.obtenerItemSVL();
			Iterator<ItemLVS> iter = item.iterator();

			VisitaItemLVS visitaitem = null;
			while (iter.hasNext()) {
				ItemLVS it = (ItemLVS) iter.next();

				if (ht.containsKey(it.getId())) {
					visitaitem = new VisitaItemLVS(visita, ((Seguridad) ht
							.get(it.getId())).isSeguro(), ((Seguridad) ht
							.get(it.getId())).isInseguro(), it.getId()
							.longValue(), fecha_visita, negocio.getId()
							.longValue(), sitio.getKey().getId(), area.getKey()
							.getId(), negocio.getNombre(), sitio.getNombre(),
							area.getNombre(), tseguro, tinseguro, tseguro
									.longValue()
									+ tinseguro.longValue(), it
									.getDescripcion());

				} else {
					visitaitem = new VisitaItemLVS(visita, false, false, it
							.getId().longValue(), fecha_visita, negocio.getId()
							.longValue(), sitio.getKey().getId(), area.getKey()
							.getId(), negocio.getNombre(), sitio.getNombre(),
							area.getNombre(), tseguro, tinseguro, tseguro
									.longValue()
									+ tinseguro.longValue(), it
									.getDescripcion());
				}

				visitaitems.add(visitaitem);
			}

			visita.setVisitaitems(visitaitems);

			VisitaLVSDAO.insertar(usuario, visita);
			/*
			ReporteMetasDAO.ingresoDetalleUsuario(fecha_visita, usuario,
					negocio, sitio, area, duracion, tseguro, tinseguro, tmeta,
					idNegocioUsuario, negocioUsuario.getNombre(), idGerencia,
					gerencia.getNombre());
			
			ReporteMetasDAO.ingresoConsolidadoUsuario(fecha_visita, usuario,
					duracion, tseguro, tinseguro, tmeta,
					idNegocioUsuario, negocioUsuario.getNombre(), idGerencia,
					gerencia.getNombre());

			ReporteMetasDAO.ingresoConsolidadoNegocio(fecha_visita, negocio,
					duracion, tseguro, tinseguro, tmeta,
					idNegocioUsuario, negocioUsuario.getNombre(), idGerencia,
					gerencia.getNombre());
					*/

		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;
		}
	}

	public static VisitaLVS2 editarVisitaLVS(String idUsuario, String idVisita)
			throws Exception {
		try {
			VisitaLVS visita = VisitaLVSDAO.getVisitaLVSbyId(Long
					.valueOf(idUsuario), Long.valueOf(idVisita));

			SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy");
			SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
			String fecha = sdf1.format(visita.getFecha());
			String horaini = sdf2.format(visita.getHoraInico());
			String horafin = sdf2.format(visita.getHoraTermino());

			VisitaLVS2 visita2 = new VisitaLVS2(fecha, horaini, horafin, visita
					.getPersonas(), visita.getComentario(),
					visita.getNegocio(), visita.getSitio(), visita.getArea(),
					visita.getResponsable(), visita.getNombreNegocio(), visita
							.getNombreSitio(), visita.getNombreArea());
			return visita2;
		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;

		}
	}

	public static void borrarVisitaLVS(String idUsuario, String idVisita)
			throws Exception {
		try {
			VisitaLVSDAO
					.borrar(Long.valueOf(idUsuario), Long.valueOf(idVisita));
		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;
		}
	}

	public static List<ItemLVS2> obtenerItemSVL(String idUsuario,
			String idVisita) throws Exception {
		try {

			List<VisitaItemLVS> visitaitemList = VisitaLVSDAO.obtenerItemSVL(
					Long.valueOf(idUsuario), Long.valueOf(idVisita));

			Iterator<VisitaItemLVS> ite = visitaitemList.iterator();
			ArrayList<ItemLVS2> itemList2 = new ArrayList<ItemLVS2>();
			while (ite.hasNext()) {
				log.info("ENTRO EN WHILE");
				VisitaItemLVS obj = (VisitaItemLVS) ite.next();
				log.info("ITEM --- > " + obj.getItem());
				ItemLVS item = ItemSVLBO.editarItemSVL(String.valueOf(obj
						.getItem()));
				String descripcion = item.getDescripcion();
				log.info("DESCRIPCION --- > " + descripcion);
				itemList2.add(new ItemLVS2(obj.getItem(), obj.getSeguro(), obj
						.getInseguro(), descripcion));
			}
			// faltan los items que se pueden haber agregado despues
			return itemList2;
		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;
		}
	}

	public static List<ItemLVS2> obtenerItemSVL2(String idUsuario,
			String idVisita) throws Exception {
		try {
			List<ItemLVS> itemList = ItemSVLBO.obtenerItemSVL();// todos los
			// items
			List<VisitaItemLVS> visitaitemList = VisitaLVSDAO.obtenerItemSVL(
					Long.valueOf(idUsuario), Long.valueOf(idVisita));// los

			Hashtable<Long, Seguridad> ht = new Hashtable<Long, Seguridad>();

			Iterator<VisitaItemLVS> iter = visitaitemList.iterator();

			while (iter.hasNext()) {
				VisitaItemLVS objItemVisita = (VisitaItemLVS) iter.next();
				ht.put(objItemVisita.getItem(), new Seguridad(objItemVisita
						.getSeguro(), objItemVisita.getInseguro()));

			}

			Iterator<ItemLVS> it = itemList.iterator();
			ArrayList<ItemLVS2> itemList2 = new ArrayList<ItemLVS2>();
			while (it.hasNext()) {
				ItemLVS objItem = (ItemLVS) it.next();
				if (ht.containsKey(objItem.getId())) {
					Seguridad seg = ht.get(objItem.getId());
					itemList2.add(new ItemLVS2(objItem.getId(), seg.isSeguro(),
							seg.isInseguro(), objItem.getDescripcion()));
				} else {
					itemList2.add(new ItemLVS2(objItem.getId(), false, false,
							objItem.getDescripcion()));
				}
			}
			return itemList2;
		} catch (Exception e) {
			log.error(e.getMessage());
			throw e;
		}
	}

}
